package com.ruoyi.common.utils;

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.HOGDescriptor;

public class BodyBlurUtil {

    // 加载OpenCV库
    static { System.load("D:\\Program Files\\opencv\\build\\java\\x64\\opencv_java4100.dll");  }

    public static void main(String[] args) {
        // 创建HOGDescriptor对象并加载预训练的行人检测模型
        HOGDescriptor hog = new HOGDescriptor();
        hog.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());

        // 读取输入图片
        Mat image = Imgcodecs.imread("C:\\Users\\lenovo\\Desktop\\000010.jpg");

        // 如果图片未成功读取，输出错误并退出
        if (image.empty()) {
            System.out.println("无法读取图片，请检查图片路径。");
            return;
        }

        // 创建用于保存检测结果的变量
        MatOfRect foundLocations = new MatOfRect();  // 用于保存检测到的矩形框位置
        MatOfDouble foundWeights = new MatOfDouble(); // 用于保存每个检测框的置信度权重
        // 尝试使用最简单的检测调用
        hog.detectMultiScale(image, foundLocations,foundWeights);



        // 遍历检测到的人体区域，并进行模糊或马赛克化处理
        for (Rect rect : foundLocations.toArray()) {
//            // 获取人体区域的ROI（Region of Interest）
            Mat bodyROI = image.submat(rect);
//            // 使用高斯模糊进行脱敏处理
            Imgproc.GaussianBlur(bodyROI, bodyROI, new Size(15, 15), 15);

//             如果想使用马赛克处理，则可以使用以下代码
//             Mat temp = new Mat();
//             Imgproc.resize(bodyROI, temp, new Size(rect.width / 10, rect.height / 10), 1, 1, Imgproc.INTER_LINEAR);
//             Imgproc.resize(temp, bodyROI, new Size(rect.width, rect.height), 1, 1, Imgproc.INTER_NEAREST);
        }

        // 保存处理后的图像
        Imgcodecs.imwrite("C:\\Users\\lenovo\\Desktop\\output.jpg", image);
        System.out.println("处理完成，脱敏后的图像已保存为 output.jpg");
    }
}
